	/**
	 * 调整堆
	 * @param array
	 * @param index
	 * @param length
	 */
	public static void heapAdjust(int[] array,int index,int length){
		//保存当前结点的下标
		int max = index;
		//当前节点左子节点的下标
		int lchild = 2*index;
		//当前节点右子节点的下标
		int rchild = 2*index + 1;
		if(length > lchild && array[max] < array[lchild]){
			max = lchild;
		}
		if(length > rchild && array[max] < array[rchild]){
			max = rchild;
		}
		//若此节点比其左右孩子的值小，就将其和最大值交换，并调整堆
		if(max != index){
			int temp = array[index];
			array[index] = array[max];
			array[max] = temp;
			heapAdjust(array,max,length);
		}
		
	}
	
	/**
	 * 堆排序
	 * @param array
	 * @return
	 */
	public static int[] heapSort(int[] array){
		int len = array.length;
		//初始化堆，构造一个最大堆
		for(int i = (len/2 - 1);i >= 0;i--){
			heapAdjust(array,i,len);
		}
		//将堆顶的元素和最后一个元素交换，并重新调整堆
		for(int i = len - 1;i > 0;i--){
			int temp = array[i];
			array[i] = array[0];
			array[0] = temp;
			
			heapAdjust(array,0,i);
		}
		return array;
	}